import Vue from 'vue'
import App from './App.vue'
import router from './router'  //引入Vuerouter但是这里的router不是模块，是我router文件夹下的indes.js中的配置，并合并到main.js
import store from './store'
import ElementUI from 'element-ui'; //引入饿了么JS模块
import 'element-ui/lib/theme-chalk/index.css'; //引入饿了么CSS
import axios from 'axios' //引入axios

// 对MD5的支持
import md5 from 'js-md5';
Vue.prototype.$md5 = md5;

// 关闭配置提示
Vue.config.productionTip = false

Vue.use(ElementUI) //声明饿了么模块
Vue.prototype.$http = axios //声明axios并且起别名$http，等同于 Vue.use(axios)
import qs from 'qs' //引入qs模块，用来序列化post类型的数据，某些请求会用得到

// 引用自己封装的组件
import ut1 from './util/MyToolsUtil'
Vue.prototype.$ut1 = ut1

// store
import myStore1 from '../src/store/token';
Vue.prototype.$token = myStore1;
// store2-->modules
import mymodule from '../src/store/xmodule';
Vue.prototype.$mymodule = mymodule;

// 添加请求拦截器   发生在请求之前
axios.interceptors.request.use(config => {
  // 如果登录获得的响应头Token还在本地存储中，就把它加到下一次请求的请求头中,不需要清除，若token过期返回401,转向登录页即可
  let token = localStorage.getItem('Authorization')
  if (token != 'null' || token != '' || token != null) {
    config.headers.Authorization = localStorage.getItem('Authorization');
    // config.headers['Authorization'] = 
  }
  // 如果不是post请求,不做处理
  if (config.method != 'post') {
      // 是post以外的请求   || 传递的参数时formData
      return config
  }
  // 把数据进行转换
  /**
   * qs.stringify()将对象序列化成URL的形式，以&进行拼接。
   * JSON.stringify()讲对象转换为json字符串
   */
  qs.stringify(config.data)
  config.data = JSON.stringify(config.data)
  return config;
}, function(error) {
  // 对请求错误做些什么 TODO
  return Promise.reject(error);
});

// 添加响应拦截器    发生在后台给我返回请求之前
axios.interceptors.response.use(response => {
  // 对响应数据做点什么 TODO
  return response;
}, error => {
  // 对响应错误做点什么 TODO
  /**
   *对响应错误做点什么
    服务器状态码不是2开头的的情况
    这里可以跟你们的后台开发人员协商好统一的错误状态码
    然后根据返回的状态码进行一些操作，例如登录过期提示，错误提示等等
    下面列举几个常见的操作，其他需求可自行扩展
   */
  if (error.response.status) {
    switch (error.response.status) {
      // 401: 未登录
      // 未登录则跳转登录页面，并携带当前页面的路径
      // 在登录成功后返回当前页面，这一步需要在登录页操作。
      case 401:
        // 如果前端拿到状态码为401，就清除token信息并跳转到登录页面
        localStorage.removeItem('Authorization');
        this.$router.push('/login');
        break;
      case 403:
        // TODO
        break;
      case 404:
        // TODO
        break;
      default:
        // TODO
        break;
    }
    return Promise.reject(error.response);
  }
  return Promise.reject(error);
});

new Vue({
  router, //在VUE实例中声明抛出的路由。
  store,
  render: function (h) { return h(App) }
}).$mount('#app')
